const cluster = require('cluster');
const os = require('os');
const KeyListener = require('./KeyListener');
const { ConsolePusher } = require('./Pusher');
const CacheHolder = require('./CacheHolder');
const KeyRuleHolder = require('./KeyRuleHolder');

/**
 * 主应用类
 * 处理热键检测和多进程管理
 */
class HotKeyApp {
  constructor() {
    // 设置默认缓存过期时间
    CacheHolder.setDefaultExpireMinutes(1);
    
    // 创建热键监听器
    this.keyListener = new KeyListener();
    
    // 设置推送器
    this.keyListener.setPushers([new ConsolePusher()]);
    
    // 是否启用多进程模式
    this.useCluster = false;
    
    // 工作进程数量
    this.workerCount = os.cpus().length;
  }
  
  /**
   * 配置应用
   * @param {Object} config - 配置对象
   */
  configure(config) {
    if (config.useCluster !== undefined) {
      this.useCluster = config.useCluster;
    }
    
    if (config.workerCount !== undefined) {
      this.workerCount = config.workerCount;
    }
    
    if (config.loggerOn !== undefined) {
      this.keyListener.setLoggerOn(config.loggerOn);
    }
    
    // 设置规则
    if (config.rules) {
      for (const rule of config.rules) {
        KeyRuleHolder.setRule(rule.appName, rule.keyType, {
          interval: rule.interval,
          threshold: rule.threshold
        });
      }
    }
  }
  
  /**
   * 启动应用
   */
  start() {
    if (this.useCluster && cluster.isPrimary) {
      console.log(`主进程 ${process.pid} 正在运行`);
      
      // 根据CPU核心数创建工作进程
      for (let i = 0; i < this.workerCount; i++) {
        cluster.fork();
      }
      
      // 监听工作进程退出事件，重启新进程
      cluster.on('exit', (worker, code, signal) => {
        console.log(`工作进程 ${worker.process.pid} 已退出`);
        console.log('重启新的工作进程...');
        cluster.fork();
      });
    } else {
      // 工作进程或单进程模式
      console.log(`工作进程 ${process.pid} 已启动`);
      this._startWorker();
    }
  }
  
  /**
   * 启动工作进程
   * @private
   */
  _startWorker() {
    // 这里可以添加HTTP服务器等，用于接收热键事件
    // 为了演示，我们使用模拟数据
    
    // 示例：模拟热键事件
    setInterval(() => {
      // 随机生成一些热键模型进行测试
      this._simulateHotKeys();
    }, 1000);
  }
  
  /**
   * 模拟热键数据
   * @private
   */
  _simulateHotKeys() {
    const keys = ['user_1', 'product_2', 'order_3', 'payment_4', 'inventory_5'];
    const appNames = ['app1', 'app2'];
    const keyTypes = ['string', 'hash', 'list'];
    
    // 随机选择key、应用和类型
    const key = keys[Math.floor(Math.random() * keys.length)];
    const appName = appNames[Math.floor(Math.random() * appNames.length)];
    const keyType = keyTypes[Math.floor(Math.random() * keyTypes.length)];
    
    // 创建热键模型
    const hotKeyModel = {
      key,
      appName,
      keyType,
      count: Math.floor(Math.random() * 10) + 1 // 随机1-10个计数
    };
    
    // 处理热键
    this.keyListener.newKey(hotKeyModel, 'CLIENT');
    
    // 有10%的概率删除某个热键
    if (Math.random() < 0.1) {
      this.keyListener.removeKey({
        key: keys[Math.floor(Math.random() * keys.length)],
        appName: appNames[Math.floor(Math.random() * appNames.length)],
        keyType: keyTypes[Math.floor(Math.random() * keyTypes.length)]
      }, 'CLIENT');
    }
  }
  
  /**
   * 手动添加一个热键事件
   * @param {Object} hotKeyModel - 热键模型
   */
  addHotKeyEvent(hotKeyModel) {
    this.keyListener.newKey(hotKeyModel, 'CLIENT');
  }
}

// 导出HotKeyApp类
module.exports = HotKeyApp;
